package com.nas.crocus.interceptor;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.thoughtworks.xstream.XStream;


public class DebugInterceptor implements MethodInterceptor {
    
    private static final Logger logger = LoggerFactory.getLogger(DebugInterceptor.class);
    
    private static String SEPARADOR = "\n--------------------------------------------------------------------------------\n";
    private static String INICIO =    "\n------------------------------------INICIO-------------------------------------\n";
    private static String FIN =       "\n-------------------------------------FIN---------------------------------------\n";
    
    private XStream xStream = new XStream();
    
    @Override
    public Object invoke(MethodInvocation metodo) throws Throwable {
        
        Logger targetLogger = LoggerFactory.getLogger(metodo.getMethod().getDeclaringClass());
        
        
        Object objeto = null;
        if (targetLogger.isDebugEnabled()) {
            objeto = invocarConLoguer(metodo, targetLogger);
        } else {
            objeto = metodo.proceed();
        }
        
        return objeto;
    }
    
    private Object invocarConLoguer(MethodInvocation metodo, Logger targetLogger) throws Throwable{
        StringBuffer mensaje = new StringBuffer();
        Object objeto = null;
        mensaje.append(INICIO);
        mensaje.append(metodo.getMethod().getDeclaringClass()).append(".").append(metodo.getMethod().getName()).append("\n");
        mensaje.append(SEPARADOR);
        mensaje.append("ARGUMENTOS: \n");
        mensaje.append(xStream.toXML(metodo.getArguments()));
        mensaje.append(SEPARADOR);
        try {
        //Invoco el metodo
            objeto = metodo.proceed();
            mensaje.append("\nOBJETO DE RETORNO: \n");
            mensaje.append(xStream.toXML(objeto));
            mensaje.append(FIN);
            targetLogger.debug(mensaje.toString());
        } catch(Exception exception) {
            mensaje.append("\nEXCEPCION: \n");
            mensaje.append(xStream.toXML(exception));
            mensaje.append(FIN);
            targetLogger.debug(mensaje.toString());
            throw exception;        
        }
        return objeto;
        
    }

}
